#ifndef __Y64_CPU_H__
#define __Y64_CPU_H__

/*
寄存器说明：
    通用寄存器：
        EAX: 用于累加操作或保存计算结果
        EBX: 作为DS数据段寄存器的段内偏移指针
        ECX: 字符串和循环操作的计数器
        EDX: I/O地址指针
        ESI: 作为DS数据段寄存器的段内偏移指针（源地址指针）
        EDI: 作为DS数据段寄存器的段内偏移指针（目标地址指针）
        ESP: 栈指针
        EBP: 栈帧（段内偏移指针）
        R8~R15: 64位模式下有效
    EFLAGS标志寄存器:
        CF      Carry flag              进位        0       0-未发生进位或错位，1-发生进位或错位（无符号整型计算结果的溢出状态、也可用于多倍精度计算）
        PF      Parity flag             奇偶        2       0-奇数个1，1-偶数个1
        AF      Auxiliary Carry flag    辅助        4       0-未发生进位或错位，1-发生进位或错位（用于BCD算术运算）
        ZF      Zero flag               零值        6       0-计算结果不为0，1-计算结果为0
        SF      Sign flag               符号        7       0-正值，1-负值
        DF      Direction flag          方向        10      0-自增，1-自减（控制字符串指令的操作方向）
        OF      Overflow flag           溢出        11      0-未发生溢出，1-发生溢出
        TF      Trap                                8       使能单步调试功能
        IF      InterruptEnable                     9       使能中断
        IOPL    I/O Privilege Level Field           12,13   访问I/O端口地址的最低特权级
        NT      Nested Task                         14      允许任务嵌套调用
        RF      Resume                              16      允许调试异常
        VM      Virtual-8086 Mode                   17      使能Virtual-8086模式
        AC      Alignment Check or Access Control   18      数据对齐检测
        VIF     Virtual Interrupt                   19      IF中断使能标志位的虚拟镜像
        VIP     Vritual Interrupt Pending           20      中断挂起
        ID      Identification                      21      检测CPUID指令
    控制寄存器
        CR0: 控制处理器的状态和运行模式 PG[31],CD[30],NW[29],[28~19],AM[18],[17],WP[16],[15~6],NE[5],ET[4],TS[3],EM[2],MP[1],PE[0]
        CR1: 保留
        CR2: 引起#PF异常的线性地址
        CR3: 记录页目录的物理地址基地址和属性 页目录基地址[63~12],[11~5],PCD[4],PWT[3],[2~0]
        CR4: 体系结构扩展功能的使能标志位 [63~22],SMAP[21],SMEP[20],[19],OSXSAVE[18],PCIDE[17],FSGSBASE[16],[15],SMXE[14],VMXE[13],[12~11],OSXMMEXCPT[10],OSFXSR[9],PCE[8],PGE[7],MCE[6],PAE[5],PSE[4],DE[3],TSD[2],PVI[1],VME[0]
        CR8: 读写访问的任务优先级寄存器
        ---------------------------------------------------------------------------------------------------------------------------------
        PG              Paging                                  使能分页管理机制
        CD              Cache Disable                           控制系统内存的缓存机制
        NW              Not Write-through                       控制系统内存的写穿机制
        AM              Alignment Mask                          数据对齐检测
        WP              Write Protect                           开启只读页的写保护
        NE              Numeric Error                           选择x87FPU的错误通知机制
        ET              Extension Type                          检测Intel 387 DX协处理器
        TS              Task Switched                           

    
地址空间
    虚拟地址：抽象地址
        逻辑地址：段基地址+段内偏移地址，Segment:Offset
        线性地址：端机地址与段内偏移地址组合而成
    物理地址：真实存在硬件设备的地址
        I/O地址：与内存地址空间相互隔离，必须通过IN/OUT指令才能访问，寻址范围0x0~0xffff，其中0xf8~0xff保留
        内存地址：不仅包括物理内存，还有其他外部硬件设备的地址空间
        
*/

#define NR_CPUS 8

// eax=主功能号，ecx=子功能号
inline void get_cpuid(unsigned int m_op, unsigned int s_op, unsigned int *a, unsigned int *b, unsigned int *c, unsigned int *d);

void cpu_init(void);

#endif